package utils

import (
	"encoding/json"
	"io/ioutil"
	"log"
	"os"
	"time"
)

// GlobalConfig 定义一个全局的配置对象
var GlobalConfig *Config

// 全局日志操作
var LogError *log.Logger

func init() {
	GlobalConfig = &Config{
		ConfFilePath: "config/config.json",

		Sqlsetmaxidleconns: 0,
		SetMaxOpenConns:    0,
		SetConnMaxLifetime: 0,
		Sqlusername:        "root",
		Sqlpassword:        "123456",
		Sqladdr:            "192.168.1.1",
		Sqlport:            3306,
		SqldbName:          "test",
		Sqlcharset:         "utf8",
	}

	//从配置文件中加载一些用户配置的参数
	GlobalConfig.Reload()
	LogError = log.New(os.Stderr, "[ERROR] ", log.Ldate|log.Ltime|log.Lshortfile)
}

// Config 配置对象
type Config struct {
	// config file path 配置文件的存放目录
	ConfFilePath string
	/*
	 mysql
	*/
	/*
		设置连接池中的保持连接的最大连接数。
		默认也是0，表示连接池不会保持数据库连接的状态：即当连接释放回到连接池的时候，连接将会被关闭。
		这会导致连接再连接池中频繁的关闭和创建，我们可以设置一个合理的值。
	*/
	Sqlsetmaxidleconns int
	/*
		设置打开数据库的最大连接数。包含正在使用的连接和连接池的连接。
		如果你的方法调用 需要用到一个连接，并且连接池已经没有了连接或者连接数达到了最大连接数。
		此时的方法调用将会被 block，直到有可用的连接才会返回。设置这个值可以避免并发太高导致连接 mysql 出现 too many connections 的错误。
		该函数的默认设置是0，表示无限制
	*/
	SetMaxOpenConns int
	/*
		设置连接可以被使用的最长有效时间，如果过期，连接将被拒绝
	*/
	SetConnMaxLifetime time.Duration
	Sqlusername        string // 数据库用户名
	Sqlpassword        string // 数据库密码
	Sqladdr            string // 数据库连接地址
	Sqlport            int    // 数据库端口
	SqldbName          string // 数据库名称
	Sqlcharset         string // 数据库编码格式
}

// PathExists 判断一个文件是否存在
func PathExists(path string) (bool, error) {
	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

// Reload 读取用户的配置文件
func (g *Config) Reload() {
	if confFileExists, _ := PathExists(g.ConfFilePath); confFileExists != true {
		panic("load config file error,not find file")
	}

	data, err := ioutil.ReadFile(g.ConfFilePath)
	if err != nil {
		panic(err)
	}

	//将json数据解析到struct中
	err = json.Unmarshal(data, g)
	if err != nil {
		panic(err)
	}
}
